﻿using UnityEngine;
using UnityEditor;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;

//原项目地址 https://github.com/qinyuanpei/Excel2Unity.git
/// <summary>
/// 导出配置文件的窗体
/// </summary>
namespace SG
{
    public class Excel2UnityEditor : EditorWindow
    {
        class ExportExcelItem
        {
            public bool isExport = true;
            public string Path = "";
            public string DisPlayName = "";
            public ExportExcelItem(string excelfullPath)
            {
                Path = excelfullPath;
                DisPlayName = excelfullPath.Replace(Application.dataPath, "");
            }
        }/// <summary>
         /// 项目配表路径	
         /// </summary>
        private static string defalutExelPath = EditorAssetsDefines.PathRawExcels;
        private static string searchExcelPath = "";

        /// <summary>
        /// 当前编辑器窗口实例
        /// </summary>
        private static Excel2UnityEditor instance;

        /// <summary>
        /// Excel文件列表
        /// </summary>
        private static List<ExportExcelItem> excelList = new List<ExportExcelItem>();

        /// <summary>
        /// 项目根路径	
        /// </summary>
        private static string pathRoot;

        /// <summary>
        /// 滚动窗口初始位置
        /// </summary>
        private static Vector2 scrollPos;

        /// <summary>
        /// 输出格式索引
        /// </summary>
        private static int indexOfFormat = 0;

        /// <summary>
        /// 输出格式
        /// </summary>
        private static string[] formatOption = new string[] { "JSON", "CSV", "XML", "LUA" };

        /// <summary>
        /// 编码索引
        /// </summary>
        private static int indexOfEncoding = 0;

        /// <summary>
        /// 编码选项
        /// </summary>
        private static string[] encodingOption = new string[] { "UTF-8", "GB2312" };

        /// <summary>
        /// 是否保留原始文件
        /// </summary>
        private static bool keepSource = true;

        /// <summary>
        /// 显示当前窗口	
        /// </summary>
        [MenuItem("SGTools/Excel2Unity Window")]
        static void ShowExcelTools()
        {
            Init();
            //加载Excel文件
            LoadExcel();
            instance.Show();
        }

        void OnGUI()
        {
            DrawOptions();
            DrawExport();
        }

        /// <summary>
        /// 绘制插件界面配置项
        /// </summary>
        private void DrawOptions()
        {
            GUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("请选择格式类型:", GUILayout.Width(85));
            indexOfFormat = EditorGUILayout.Popup(indexOfFormat, formatOption, GUILayout.Width(125));
            //输出
            if (GUILayout.Button("转换"))
            {
                Convert();
            }
            GUILayout.EndHorizontal();

            GUILayout.BeginHorizontal();
            EditorGUILayout.LabelField("请选择编码类型:", GUILayout.Width(85));
            indexOfEncoding = EditorGUILayout.Popup(indexOfEncoding, encodingOption, GUILayout.Width(125));
            GUILayout.EndHorizontal();

            keepSource = GUILayout.Toggle(keepSource, "保留Excel源文件");
        }

        /// <summary>
        /// 绘制插件界面输出项
        /// </summary>
        private void DrawExport()
        {
            if (excelList == null) return;
            if (excelList.Count < 1)
            {
                EditorGUILayout.LabelField("目前没有Excel文件被选中哦!");
            }
            else
            {
                EditorGUILayout.LabelField("下列项目将被转换为" + formatOption[indexOfFormat] + ":");
                GUILayout.BeginVertical();
                scrollPos = GUILayout.BeginScrollView(scrollPos, false, true, GUILayout.Height(260));
                foreach (ExportExcelItem s in excelList)
                {
                    GUILayout.BeginHorizontal();
                    bool tg = GUILayout.Toggle(s.isExport, s.DisPlayName);
                    if (tg != s.isExport)
                        s.isExport = tg;
                    GUILayout.EndHorizontal();
                }
                GUILayout.EndScrollView();
                GUILayout.EndVertical();
            }
        }

        /// <summary>
        /// 转换Excel文件
        /// </summary>
        private static void Convert()
        {
            string exportFolder = Application.dataPath + "/" + "/Excels";
            if (!Directory.Exists(exportFolder))
                Directory.CreateDirectory(exportFolder);
            foreach (ExportExcelItem export in excelList)
            {
                string assetsPath = export.Path;
                if (!export.isExport)
                    continue;
                //获取Excel文件的绝对路径
                FileInfo excelFile = new FileInfo(export.Path);
                //构造Excel工具类
                Excel2UnityUtility excel = new Excel2UnityUtility(excelFile.FullName);

                //判断编码类型
                Encoding encoding = null;
                if (indexOfEncoding == 0 || indexOfEncoding == 3)
                {
                    encoding = Encoding.GetEncoding("utf-8");
                }
                else if (indexOfEncoding == 1)
                {
                    encoding = Encoding.GetEncoding("gb2312");
                }

                //string exportFolder = Application.dataPath + "/" + ResourceDefines.PathResources + "/Excels";
                //判断输出类型
                string output = "";
                if (indexOfFormat == 0)
                {
                    output = exportFolder + "/" + excelFile.Name.Split('.')[0] + ".json";
                    excel.ConvertToJson(output, encoding);
                }
                else if (indexOfFormat == 1)
                {
                    output = exportFolder + "/" + excelFile.Name.Split('.')[0] + ".csv";
                    excel.ConvertToCSV(output, encoding);
                }
                else if (indexOfFormat == 2)
                {
                    output = exportFolder + "/" + excelFile.Name.Split('.')[0] + ".xml";
                    excel.ConvertToXml(output);
                }
                else if (indexOfFormat == 3)
                {
                    output = exportFolder + "/" + excelFile.Name.Split('.')[0] + ".lua";
                    excel.ConvertToLua(output, encoding);
                }

                //判断是否保留源文件
                if (!keepSource)
                {
                    UnityEditor. FileUtil.DeleteFileOrDirectory(excelFile.FullName);
                }

                //刷新本地资源
                AssetDatabase.Refresh();
            }

            //转换完后关闭插件
            //这样做是为了解决窗口
            //再次点击时路径错误的Bug
            instance.Close();

        }

        /// <summary>
        /// 加载Excel
        /// </summary>
        private static void LoadExcel()
        {
            excelList.Clear();
            //获取选中的对象
            object[] selection = (object[])Selection.objects;
            //判断是否有对象被选中
            if (selection.Length == 0)
            {
                LoadAll();
                return;
            }
            string assetsPath = Application.dataPath.Substring(0, Application.dataPath.LastIndexOf("/") + 1);
            //遍历每一个对象判断不是Excel文件
            foreach (Object obj in selection)
            {
                string objPath = AssetDatabase.GetAssetPath(obj);
                if (objPath.EndsWith(".xls") || objPath.EndsWith(".xlsx"))
                {
                    excelList.Add(new ExportExcelItem(assetsPath + objPath));
                }
            }
        }
        private static void LoadAll()
        {
            List<string> files = new List<string>();
            foreach (string file in Directory.GetFiles(searchExcelPath, "*.*", SearchOption.AllDirectories))
            {
                if (file.EndsWith(".xls") || file.EndsWith(".xlsx"))
                {
                    files.Add(file);
                }
            }
            if (files.Count == 0)
            {
                Debug.LogWarning("沒有找到格式为\"xls\"或者\"xlsx\"的Excel文件");
            }
            foreach (string obj in files)
            {
                if (obj.Contains("~$"))
                    continue;
                excelList.Add(new ExportExcelItem(obj));
            }
        }

        private static void Init()
        {
            //获取当前实例
            instance = EditorWindow.GetWindow<Excel2UnityEditor>();
            //初始化
            pathRoot = Application.dataPath;
            //注意这里需要对路径进行处理
            //目的是去除Assets这部分字符以获取项目目录
            //我表示Windows的/符号一直没有搞懂
            pathRoot = pathRoot.Substring(0, pathRoot.LastIndexOf("/"));
            //初始化
            searchExcelPath = Application.dataPath + "/" + defalutExelPath;
            //注意这里需要对路径进行处理
            //目的是去除Assets这部分字符以获取项目目录
            //我表示Windows的/符号一直没有搞懂
            searchExcelPath = searchExcelPath.Substring(0, searchExcelPath.LastIndexOf("/"));

            excelList = new List<ExportExcelItem>();
            scrollPos = new Vector2(instance.position.x, instance.position.y + 75);
        }

        void OnSelectionChange()
        {
            //当选择发生变化时重绘窗体
            Show();
            LoadExcel();
            Repaint();
        }
    }
}